// strcpy

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* mycpy(char* restrict dst, const char* restrict src)
{
    // 数组版本
    // int idx = 0;
    // while (src[idx])
    // {
    //     dst[idx] = src[idx];
    //     idx++;
    // }
    // dst[idx] = '\0';

    // 指针版本
    // dst 会被 + 到数组最后，所以要提取设置一个ret
    char* ret = dst;
    while (*src)
    {
        *dst++ = *src++;
    }
    *dst = '\0';
    // 以上甚至可以写成
    // while (*dst++ = *src++) ;

    return ret;
}

int main(int argc, char const *argv[])
{
    // strcpy
    // char * strcpy(char *restrict dst, const char *restrict src);
    // 把 src 的字符串拷贝到 dst
    //  restrict: 表明 src 和 dst 不重叠（C99）
    // * 重叠的意思：
    //   dst: ***hello0
    //   src:    hello01ad
    // 返回 dst
    //      为了能链起代码来 --> 链式表达式，投入其他运算
    // 这里的 test 必须规定长度

    char src[] = "Hello World";
    // 给 dst 分配空间
    // +1 是为了放结尾的0！
    char* dst = (char*)malloc(strlen(src) + 1);
    strcpy(dst, src);
    // 返回值的作用
    printf("len = %d\n", strlen(strcpy(dst, src)));
    printf("%s\n", dst);

    char* test = (char*)malloc(strlen(src) + 1);
    printf("len = %d\n", strlen(mycpy(test, src)));
    printf("%s\n", test);


    // 之前的strcpy和strcat都是不安全的，也可能空间不足
    // 安全版本
    // char * strncpy(char *restrict dst, const char *restrict src, size_t n);
    // char * strncat(char *restrict s1, const char *restrict s2, size_t n);
    // n 表示能够拷贝/连接的最大字符数

    // int strncmp(const char *s1, const char *s2, size_t n);
    // 判断前 n 个字符是否相等
    
    return 0;
}